home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / 68343ffp.arc / FFPDBF.SA < prev    next >
Text File  |  1989-08-30  |  8KB  |  164 lines

  1.       TTL     FAST FLOATING POINT DUAL-BINARY FLOAT (FFPDBF)
  2. ************************************
  3. * (C) COPYRIGHT 1980 MOTORLA INC.  *
  4. ************************************
  5.  
  6. ***********************************************************
  7. *                                                         *
  8. *          FAST FLOATING POINT DUAL-BINARY TO FLOAT       *
  9. *                                                         *
  10. *      INPUT:  D6 BIT #16 - REPRESENTS SIGN (0=POSITIVE)  *
  11. *                                           (1=NEGATIVE)  *
  12. *              D6.W - REPRESENTS BASE TEN EXPONENT        *
  13. *                     CONSIDERING D7 A BINARY INTEGER     *
  14. *              D7 -   BINARY INTEGER MANTISSA             *
  15. *                                                         *
  16. *      OUTPUT: D7 - FAST FLOATING POINT EQUIVALENT        *
  17. *                                                         *
  18. *      CONDITION CODES:                                   *
  19. *                N - SET IF RESULT IS NEGATIVE            *
  20. *                Z - SET IF RESULT IS ZERO                *
  21. *                V - SET IF RESULT OVERFLOWED             *
  22. *                C - CLEARED                              *
  23. *                X - UNDEFINED                            *
  24. *                                                         *
  25. *      REGISTERS D3 THRU D6 DESTROYED                     *
  26. *                                                         *
  27. *      CODE SIZE: 164 BYTES     STACK WORK AREA: 4 BYTES  *
  28. *                                                         *
  29. *                                                         *
  30. *      FLOATING POINT RANGE:                              *
  31. *                                                         *
  32. *          FAST FLOATING POINT SUPPORTS THE VALUE ZERO    *
  33. *          AND NON-ZERO VALUES WITHIN THE FOLLOWING       *
  34. *          BOUNDS -                                       *
  35. *                                                         *
  36. * BASE 10                                                 *
  37. *                  18                             -20     *
  38. *   9.22337177 X 10   > +NUMBER >  5.42101070 X 10        *
  39. *                                                         *
  40. *                  18                             -20     *
  41. *  -9.22337177 X 10   > -NUMBER > -2.71050535 X 10        *
  42. *                                                         *
  43. * BASE 2                                                  *
  44. *                   63                            -63     *
  45. *      .FFFFFF  X  2   > +NUMBER >  .FFFFFF  X  2         *
  46. *                                                         *
  47. *                   63                            -64     *
  48. *     -.FFFFFF  X  2   > -NUMBER > -.FFFFFF  X  2         *
  49. *                                                         *
  50. *      PRECISION:                                         *
  51. *                                                         *
  52. *          THIS CONVERSION RESULTS IN A 24 BIT PRECISION  *
  53. *          WITH GUARANTEED ERROR LESS THAN OR EQUAL TO    *
  54. *          ONE-HALF LEAST SIGNIFICANT BIT.                *
  55. *                                                         *
  56. *                                                         *
  57. *      NOTES:                                             *
  58. *          1) THE INPUT FORMATS HAVE BEEN DESIGNED FOR    *
  59. *             EASE OF PARSING TEXT FOR CONVERSION TO      *
  60. *             FLOATING POINT.  SEE FFPASF FOR COMMENTS    *
  61. *             DESCRIBING THE METHOD FOR SETUP TO THIS     *
  62. *             ROUTINE.                                    *
  63. *          2) UNDERFLOWS RETURN A ZERO WITHOUT ANY        *
  64. *             INDICATORS SET.                             *
  65. *          3) OVERFLOWS WILL RETURN THE MAXIMUM VALUE     *
  66. *             POSSIBLE WITH PROPER SIGN AND THE 'V' BIT   *
  67. *             SET IN THE CCR REGISTER.                    *
  68. *                                                         *
  69. ***********************************************************
  70.          PAGE
  71. FFPDBF IDNT    1,1  FFP DUAL-BINARY TO FLOAT
  72.  
  73.       OPT     PCS
  74.  
  75.       XDEF    FFPDBF      ENTRY POINT
  76.  
  77.       XREF    9:FFP10TBL     POWER OF TEN TABLE
  78.  
  79.          SECTION    9
  80.  
  81. * NORMALIZE THE INPUT BINARY MANTISSA
  82. FFPDBF   MOVE.L    #32,D5    SETUP BASE 2 EXPONENT MAX
  83.          TST.L     D7        ? TEST FOR ZERO
  84.          BEQ       FPDRTN    RETURN, NO CONVERSION NEEDED
  85.          BMI.S     FPDINM    BRANCH INPUT ALREADY NORMALIZED
  86.          MOVE.L    #31,D5    PREPARE FOR NORMALIZE LOOP
  87. FPDNMI   ADD.L     D7,D7     SHIFT UP BY ONE
  88.          DBMI      D5,FPDNMI DECREMENT AND LOOP IF NOT YET
  89.  
  90. * INSURE INPUT 10 POWER INDEX NOT WAY OFF BASE
  91. FPDINM   CMP.W     #18,D6    ? WAY TOO LARGE
  92.          BGT.S     FPDOVF    BRANCH OVERFLOW
  93.          CMP.W     #-28,D6   ? WAY TOO SMALL
  94.          BLT.S     FPDRT0    RETURN ZERO IF UNDERFLOW
  95.          MOVE.W    D6,D4     COPY 10 POWER INDEX
  96.          NEG.W     D4        INVERT TO GO PROPER DIRECTION
  97.          MULS.W    #6,D4     TIMES FOUR FOR INDEX
  98.          MOVE.L    A0,-(SP)  SAVE WORK ADDRESS REGISTER
  99.          LEA       FFP10TBL,A0 LOAD TABLE ADDRESS
  100.          ADD.W     0(A0,D4.W),D5 ADD EXPONENTS FOR MULTIPLY
  101.          MOVE.W    D5,D6     SAVE RESULT EXPONENT IN D6.W
  102.  
  103. * NOW PERFORM 32 BIT MULTIPLY OF INPUT WITH POWER OF TEN TABLE
  104.          MOVE.L    2(A0,D4.W),D3 LOAD TABLE MANTISSA VALUE
  105.          MOVE.L    (SP),A0   RESTORE WORK REGISTER
  106.          MOVE.L    D3,(SP)   NOW SAVE TABLE MANTISSA ON STACK
  107.          MOVE.W    D7,D5     COPY INPUT VALUE
  108.          MULU.W    D3,D5     TABLELOW X INPUTLOW
  109.          CLR.W     D5        LOW END NO LONGER TAKES AFFECT
  110.          SWAP.W    D5        SAVE INTERMEDIATE SUM
  111.          MOVE.L    #0,D4     CREATE A ZERO FOR DOUBLE PRECISION
  112.          SWAP.W    D3        TO HIGH TABLE WORD
  113.          MULU.W    D7,D3     INPUTLOW X TABLEHIGH
  114.          ADD.L     D3,D5     ADD ANOTHER PARTIAL SUM
  115.          ADDX.B    D4,D4     CREATE CARRY IF ANY
  116.          SWAP.W    D7        NOW TO INPUT HIGH
  117.          MOVE.W    D7,D3     COPY TO WORK REGISTER
  118.          MULU.W    2(SP),D3  TABLELOW X INPUTHIGH
  119.          ADD.L     D3,D5     ADD ANOTHER PARTIAL
  120.          BCC.S     FPDNOC    BRANCH NO CARRY
  121.          ADD.B     #1,D4     ADD ANOTHER CARRY
  122. FPDNOC   MOVE.W    D4,D5     CONCAT HIGH WORK WITH LOW
  123.          SWAP.W    D5        AND CORRECT POSITIONS
  124.          MULU.W    (SP),D7   TABLEHIGH X INPUTHIGH
  125.          LEA       4(SP),SP  CLEAN UP STACK
  126.          ADD.L     D5,D7     FINAL PARTIAL PRODUCT
  127.          BMI.S     FPDNON    BRANCH IF NO NEED TO NORMALIZE
  128.          ADD.L     D7,D7     NORMALIZE
  129.          SUB.W     #1,D6     ADJUST EXPONENT
  130. FPDNON   ADD.L     #$80,D7   ROUND RESULT TO 24 BITS
  131.          BCC.S     FPDROK    BRANCH ROUND DID NOT OVERFLOW
  132.          ROXR.L    #1,D7     ADJUST BACK
  133.          ADD.W     #1,D6     AND INCREMENT EXPONENT
  134. FPDROK   MOVEQ     #9,D3     PREPARE TO FINALIZE EXPONENT TO 7 BITS
  135.          MOVE.W    D6,D4     SAVE SIGN OF EXPONENT
  136.          ASL.W     D3,D6     FORCE 7 BIT PRECISION
  137.          BVS.S     FPDXOV    BRANCH EXPONENT OVERFLOW
  138.          EOR.W     #$8000,D6 EXPONENT BACK FROM 2'S-COMPLEMENT
  139.          LSR.L     D3,D6     PLACE INTO LOW BYTE WITH SIGN
  140.          MOVE.B    D6,D7     INSERT INTO RESULT
  141.          BEQ.S     FPDRT0    RETURN ZERO IF EXPONENT ZERO
  142. FPDRTN   RTS                 RETURN TO CALLER
  143.  
  144. * RETURN ZERO FOR UNDERFLOW
  145. FPDRT0   MOVEQ     #0,D7     RETURN ZERO
  146.          RTS                 RETURN TO CALLER
  147.  
  148. * EXPONENT OVERFLOW/UNDERFLOW
  149. FPDXOV   TST.W     D4        TEST ORIGINAL SIGN
  150.          BMI.S     FPDRT0    BRANCH UNDERFLOW TO RETURN ZERO
  151. FPDOVF   MOVEQ     #-1,D7    CREATE ALL ONES
  152.          SWAP.W    D6        SIGN TO LOW BIT
  153.          ROXR.B    #1,D6     SIGN TO X BIT
  154.          ROXR.B    #1,D7     SIGN INTO HIGHEST POSSIBLE RESULT
  155.          TST.B     D7        CLEAR CARRY BIT
  156. *        OR.W      #$0002,CCR SET OVERFLOW ON
  157.          DC.L      $003C0002 ****ASSEMBLER ERROR****
  158.          RTS                 RETURN TO CALLER WITH OVERFLOW
  159.  
  160.  
  161.          END
  162.  
  163.  
  164.